﻿using System;

namespace Lesson22_万物之父中的方法
{
    //测试MemberwiseClone方法
    class Test
    {
        public int i = 1;
        public Test2 t = new Test2();
        public Test Clone()
        {
            //MemberwiseClone()复制出的对象类型与原类型相同 返回值为object类型
            return MemberwiseClone() as Test;
        }
        public override string ToString()
        {
            return "重写ToString()方法";
        }
    }
    class Test2
    {
        public int i = 2;
    }

    class Program
    {
        static void Main(string[] args)
        {
            #region 一 静态方法
            //1.Equals(object objA, object objB) 判断两个对象是否相等
            //根据左侧对象类型的规则进行比较
            object obj1 = new object();
            object obj2 = new object();
            Console.WriteLine(object.Equals(1, 1));
            Console.WriteLine(object.Equals(1, 1.0f));
            //这里比较obj1与obj2会返回False 因为Equals比较引用类型对象时 比较的是二者是否指向同一内存地址
            Console.WriteLine(object.Equals(obj1, obj2));

            //2.ReferenceEquals(object objA, object objB) 比较两个对象是否是相同的引用
            Console.WriteLine(object.ReferenceEquals(obj1, obj1));
            Console.WriteLine(object.ReferenceEquals(obj1, obj2));
            //ReferenceEquals方法若用来比较值类型 则会直接返回False
            Console.WriteLine(object.ReferenceEquals(1, 1));
            #endregion

            #region 二 成员方法
            //不能重写 可以通过新方法调用成员方法来实现
            //1.GetType() 用于获取对象运行时的类型Type
            //在反射中有应用
            Type ty = obj1.GetType();
            int i = 0;
            ty = i.GetType();
            //2.MemberwiseClone() 用于获取对象的浅拷贝对象,也就是返回一个新的对象
            //MemberwiseClone() 返回类型为object
            //MemberwiseClone 是protected的
            Test t = new Test();
            Test t2 = t.Clone();
            t.t.i = 3;
            //引用类型变量指向的内存地址相同
            Console.WriteLine(t2.t.i);
            Console.WriteLine(t.t.i);
            //值类型变量
            t.i = 4;
            Console.WriteLine(t2.i);
            Console.WriteLine(t.i);
            #endregion

            #region 三 虚方法
            //1.Equals(object obj) 我们可以重写该方法 定义自己的比较相等的规则

            //2.GetHashCode() 可以通过重写函数来定义对象的哈希码算法

            //3.ToString() 用于返回当前对象代表的字符串，可以重写它定义我们自己的对象转字符串规则
            Console.WriteLine(t);
            //当我们打印对象时 默认调用对象的ToString方法
            #endregion
        }
    }
}